Skip to main content

第 8 章:磁碟配額與進階檔案系統

檔案系統的支援與觀察

df -hT /home
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-home xfs 5.0G 67M 5.0G 2% /home

在過去的版本中,管理員似乎可以透過 mount -o remount 的機制來重新掛載啟動 quota 的功能,不過 XFS 檔案系統的 quota 似乎是在掛載之初就宣告了, 因此無法使用 remount 來重新啟動 quota 功能,一定得要寫入 /etc/fstab 當中,或者是在初始掛載過程中加入這個項目, 否則不會生效喔

vim /etc/fstab
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota 0 0

umount /home
mount -a
mount | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)

基本上,針對 quota 限制的項目主要有三項,如下所示:

  • uquota/usrquota/quota:針對使用者帳號的設定
  • gquota/grpquota:針對群組的設定
  • pquota/prjquota:針對單一目錄的設定,但是不可與 grpquota 同時存在!

觀察 Quota 報告資料

製作檔案系統支援之後,當然得要來瞧一瞧到底有沒有正確的將 quota 的管理資料列出來才好!這時我們得要使用 xfs_quota 這個指令才行!這個指令真的是挺復雜的,因為全部的 quota 實作都是這個指令耶!所以裡面的參數有夠多! 不過稍微觀察一下即可!先讓我們來談談觀察目前 quota 的報告內容吧!

xfs_quota -x -c "指令" [掛載點]選項與參數:
-x :專家模式,後續才能夠加入 -c 的指令參數喔!
-c :後面加的就是指令,這個小節我們先來談談數據回報的指令
指令:
print :單純的列出目前主機內的檔案系統參數等資料
df :與原本的 df 一樣的功能,可以加上 -b (block) -i (inode) -h (加上單位) 等
report:列出目前的 quota 項目,有 -ugr (user/group/project) 及 -bi 等資料
state :說明目前支援 quota 的檔案系統的資訊,有沒有起動相關項目等範例一:列出目前系統的各的檔案系統,以及檔案系統的 quota 掛載參數支援
xfs_quota -x -c "print"
Filesystem Pathname
/ /dev/mapper/centos-root
/srv/myproject /dev/vda4
/boot /dev/vda2
/home /dev/mapper/centos-home (uquota, gquota) # 所以這裡就有顯示支援囉

範例二:列出目前 /home 這個支援 quota 的載點檔案系統使用情況
xfs_quota -x -c "df -h" /home
Filesystem Size Used Avail Use% Pathname
/dev/mapper/centos-home
5.0G 67.0M 4.9G 1% /home
# 如上所示,其實跟原本的 df 差不多啦!只是會更正確就是了。範例三:列出目前 /home 的所有用戶的 quota 限制值
xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 4K 0 0 00 [------] 4 0 0 00 [------]
dmtsai 34.0M 0 0 00 [------] 432 0 0 00 [------]
.....(中間省略).....
myquota1 12K 0 0 00 [------] 7 0 0 00 [------]
myquota2 12K 0 0 00 [------] 7 0 0 00 [------]
myquota3 12K 0 0 00 [------] 7 0 0 00 [------]
myquota4 12K 0 0 00 [------] 7 0 0 00 [------]
myquota5 12K 0 0 00 [------] 7 0 0 00 [------]
# 所以列出了所有用戶的目前的檔案使用情況,並且列出設定值。注意,最上面的 Block
# 代表這個是 block 容量限制,而 inode 則是檔案數量限制喔。另外,soft/hard 若為 0,代表沒限制範例四:列出目前支援的 quota 檔案系統是否有起動了 quota 功能?
xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON # 有啟用計算功能
Enforcement: ON # 有實際 quota 管制的功能
Inode: #1568 (4 blocks, 4 extents) # 上面四行說明的是有啟動 user 的限制能力
Group quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: ON
Inode: #1569 (5 blocks, 5 extents) # 上面四行說明的是有啟動 group 的限制能力
Project quota state on /home (/dev/mapper/centos-home)
Accounting: OFF
Enforcement: OFF
Inode: #1569 (5 blocks, 5 extents) # 上面四行說明的是 project 並未支援
Blocks grace time: [7 days 00:00:30] # 底下則是 grace time 的項目
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

限制值設定方式

確認檔案系統的 quota 支援順利啟用後,也能夠觀察到相關的 quota 限制,接下來就是要實際的給予用戶/群組限制囉! 回去瞧瞧,我們需要每個用戶 250M/300M 的容量限制,群組共 950M/1G 的容量限制,同時 grace time 設定為 14 天喔! 實際的語法與設定流程來瞧瞧:

xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
xfs_quota -x -c "timer [-ug] [-bir] Ndays"選項與參數:
limit :實際限制的項目,可以針對 user/group 來限制,限制的項目有
bsoft/bhard : block 的 soft/hard 限制值,可以加單位
isoft/ihard : inode 的 soft/hard 限制值
name : 就是用戶/群組的名稱啊!
timer :用來設定 grace time 的項目喔,也是可以針對 user/group 以及 block/inode 設定範例一:設定好用戶們的 block 限制值 (題目中沒有要限制 inode 啦!)
xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /home
xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota2" /home
xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota3" /home
xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota4" /home
xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota5" /home
xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquota1 12K 250M 300M 00 [------] 7 0 0 00 [------]

範例二:設定好 myquotagrp 的 block 限制值
xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /home
xfs_quota -x -c "report -gbih" /home
Group quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotagrp 60K 950M 1G 00 [------] 36 0 0 00 [------]

範例三:設定一下 grace time 變成 14 天吧!
xfs_quota -x -c "timer -ug -b 14days" /home
xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
.....(中間省略).....
Blocks grace time: [14 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

範例四:以 myquota1 用戶測試 quota 是否真的實際運作呢?
su - myquota1
[myquota1@study ~]$dd if=/dev/zero of=123.img bs=1M count=310
dd: error writing ‘123.img’: Disk quota exceeded
300+0 records in
299+0 records out
314552320 bytes (315 MB) copied, 0.181088 s, 1.7 GB/s
[myquota1@study ~]$ll -h
-rw-r--r--. 1 myquota1 myquotagrp 300M Jul 24 21:38 123.img

[myquota1@study ~]$exit
xfs_quota -x -c "report -ubh" /home
User quota on /home (/dev/mapper/centos-home)
Blocks
User ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquota1 300M 250M 300M 00 [13 days]
myquota2 12K 250M 300M 00 [------]
# 因為 myquota1 的磁碟用量已經破表,所以當然就會出現那個可怕的 grace time 囉!

project 的限制 (Optional)

現在讓我們來想一想,如果需要限制的是目錄而不是群組時,那該如何處理呢?舉例來說,我們要限制的是 /home/myquota 這個目錄本身, 而不是針對 myquotagrp 這個群組啊!這兩種設定方法的意義不同喔!例如,前一個小節談到的測試範例來說, myquota1 已經消耗了 300M 的容量,而 /home/myquota 其實還沒有任何的使用量 (因為在 myquota1 的家目錄做的 dd 指令)。 不過如果你使用了 xfs_quota -x -c "report -h" /home 這個指令來查看,就會發現其實 myquotagrp 已經用掉了 300M 了! 如此一來,對於目錄的限制來說,就不會有效果!

為了解決這個問題,因此我們這個小節要來設定那個很有趣的 project 項目!只是這個項目不可以跟 group 同時設定喔! 因此我們得要取消 group 設定並且加入 project 設定才行。那就來實驗看看。

  • 修改 /etc/fstab 內的檔案系統支援參數

首先,要將 grpquota 的參數取消,然後加入 prjquota ,並且卸載 /home 再重新掛載才行!那就來測試看看!

# 1. 先修改 /etc/fstab 的參數,並啟動檔案系統的支援
vim /etc/fstab
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota,prjquota 0 0
# 記得, grpquota 與 prjquota 不可同時設定喔!所以上面刪除 grpquota 加入 prjquota

umount /home
mount -a
xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: ON
Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
Accounting: OFF <==已經取消囉!
Enforcement: OFF
Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
Accounting: ON <==確實啟動囉!
Enforcement: ON
Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

  • 規範目錄、專案名稱(project)與專案 ID

目錄的設定比較奇怪,他必須要指定一個所謂的『專案名稱、專案識別碼』來規範才行!而且還需要用到兩個設定檔。我們要規範的目錄是 /home/myquota 目錄,這個目錄我們給個 myquotaproject 的專案名稱, 這個專案名稱給個 11 的識別碼,這個都是自己指定的,若不喜歡就自己指定另一個吧!

# 2.1 指定專案識別碼與目錄的對應在 /etc/projects
echo "11:/home/myquota" >> /etc/projects# 2.2 規範專案名稱與識別碼的對應在 /etc/projid
echo "myquotaproject:11" >> /etc/projid# 2.3 初始化專案名稱
xfs_quota -x -c "project -s myquotaproject"
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion
depth infinite (-1). # 會閃過這些訊息!是 OK 的!別擔心!

xfs_quota -x -c "print " /home
Filesystem Pathname
/home /dev/mapper/centos-home (uquota, pquota)
/home/myquota /dev/mapper/centos-home (project 11, myquotaproject)
# 這個 print 功能很不錯!可以完整的查看到相對應的各項檔案系統與 project 目錄對應!

xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 0 0 00 [------] 1 0 0 00 [------]
# 喔耶!確定有抓到這個專案名稱囉!接下來準備設定吧!
  • 實際設定規範與測試

依據本章的說明,我們要將 /home/myquota 指定為 500M 的容量限制,那假設到 450M 為 soft 的限制好了! 那麼設定就會變成這樣囉:

# 3.1 先來設定好這個 project 吧!設定的方式同樣使用 limit 的 bsoft/bhard 喔!:
xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 450M 500M 00 [------] 1 0 0 00 [------]

dd if=/dev/zero of=/home/myquota/123.img bs=1M count=510
dd: error writing '/home/myquota/123.img': No space left on device
501+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 0.96296 s, 544 MB/s
# 你看!連 root 在該目錄底下建立檔案時,也會被擋掉耶!這才是完整的針對目錄的規範嘛!讚!

這樣就設定好了囉!未來如果你還想要針對某些個目錄進行限制,那麼就修改 /etc/projects, /etc/projid 設定一下規範, 然後直接處理目錄的初始化與設定,就完成設定了!好簡單!

XFS quota 的管理與額外指令對照表

不管多完美的系統,總是需要可能的突發狀況應付手段啊!所以,接下來我們就來談談,那麼萬一如果你需要暫停 quota 的限制, 或者是重新啟動 quota 的限制時,該如何處理呢?還是使用 xfs_quota 啦!增加幾個內部指令即可:

  • disable:暫時取消 quota 的限制,但其實系統還是在計算 quota 中,只是沒有管制而已!應該算最有用的功能囉!
  • enable:就是回復到正常管制的狀態中,與 disable 可以互相取消、啟用!
  • off:完全關閉 quota 的限制,使用了這個狀態後,你只有卸載再重新掛載才能夠再次的啟動 quota 喔!也就是說, 用了 off 狀態後,你無法使用 enable 再次復原 quota 的管制喔!注意不要亂用這個狀態!一般建議用 disable 即可,除非你需要執行 remove 的動作!
  • remove:必須要在 off 的狀態下才能夠執行的指令~這個 remove 可以『移除』quota 的限制設定,例如要取消 project 的設定, 無須重新設定為 0 喔!只要 remove -p 就可以了!
# 1. 暫時關閉 XFS 檔案系統的 quota 限制功能
xfs_quota -x -c "disable -up" /home
xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: OFF <== 意思就是有在計算,但沒有強制管制的意思
Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
Accounting: OFF
Enforcement: OFF
Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: OFF
Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
520+0 records in
520+0 records out # 見鬼!竟然沒有任何錯誤發生了!
545259520 bytes (545 MB) copied, 0.308407 s, 180 MB/s

xfs_quota -x -c "report -pbh" /home
Project quota on /home (/dev/mapper/centos-home)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquotaproject 520M 450M 500M 00 [-none-]
# 其實,還真的有超過耶!只是因為 disable 的關係,所以沒有強制限制住就是了!

xfs_quota -x -c "enable -up" /home # 重新啟動 quota 限制
dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
dd: error writing ‘/home/myquota/123.img’: No space left on device
# 又開始有限制!這就是 enable/disable 的相關對應功能喔!暫時關閉/啟動用的!# 完全關閉 quota 的限制行為吧!同時取消 project 的功能試看看!
xfs_quota -x -c "off -up" /home
xfs_quota -x -c "enable -up" /home
XFS_QUOTAON: Function not implemented
# 您瞧瞧!沒有辦法重新啟動!因為已經完全的關閉了 quota 的功能!所以得要 umount/mount 才行!

umount /home; mount -a# 這個時候使用 report 以及 state 時,管制限制的內容又重新回來了!好!來瞧瞧如何移除project

xfs_quota -x -c "off -up" /home
xfs_quota -x -c "remove -p" /home
umount /home; mount -a
xfs_quota -x -c "report -phb" /home
Project quota on /home (/dev/mapper/centos-home)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquotaproject 500M 0 0 00 [------]
# 嘿嘿!全部歸零!就是『移除』所有限制值的意思!
設定流程項目XFS 檔案系統EXT 家族
/etc/fstab參數設定usrquota/grpquota/prjquotausrquota/grpquota
quota 設定檔不需要quotacheck
設定用戶/群組限制值xfs_quota -x -c "limit..."edquota 或 setquota
設定 grace timexfs_quota -x -c "timer..."edquota
設定目錄限制值xfs_quota -x -c "limit..."
觀察報告xfs_quota -x -c "report..."repquota 或 quota
啟動與關閉 quota 限制xfs_quota -x -c "[disableenable]..."
發送警告信給用戶目前版本尚未支援warnquota